package com.sevenit.nj.yrmtfish.common;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Properties;

import com.sevenit.nj.yrmtfish.entity.ServerData;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Environment;

/**  
 * 手机文件分为程序包内文件、内存文件、SD卡文件和网络文件，
 * 程序包内文件可以读键值对，程序卸载后就被清除；
 * 手机内存文件可以读写键值对，程序卸载后就被清除；
 * SD卡文件可以任意读写，程序卸载后不清除；
 * 网络文件可以任意读。
 * 
 *  @description: 操作文件的类.
 *  @version 1.0  
 *  @author wangxw
 */  
public class FileBase {
	
	//获取内存文件数据时需要用到.
	private Context context = null;
	//EncType 
	private String strEncType = null;
	
	/**
	 * 
	 */
	public FileBase(){
	}
		
	/**
	 * 
	 */
	public FileBase(String encType){
		this.strEncType = encType;
	}
	
	/**
	 * 
	 */
	public void openAppConf() {
	}
	
	/**  
	 * 从程序包内文件中获取配置值.
	 * @return 
	 */  
	public String getAppConfValue(String strKey) {
		
		String strValue = "";
		
		try {
			Properties props = new Properties();
			InputStream in = FileBase.class.getResourceAsStream("/appConfig.properties");
			props.load(in);
			strValue = props.getProperty(strKey);
		} catch (Exception e) {
		}
		
		return strValue;
	}
	
	/**
	 * 
	 * @param a
	 */
	public void openMemConf(Activity a) {
		context = a.getApplicationContext();
	}
	
	/**  
	 * 从手机内存中获取配置值.
	 * @return 
	 */  
	public String getMemConfValue(String strKey) {
		
		if(context == null){
			return null;
		}
		//SharedPreferences是Android平台上一个轻量级的存储类，
		//如果程序被卸载，则会自动清空存贮的数据
		SharedPreferences share = context.getSharedPreferences("CAR_HPONE", 0);
		String strValue = share.getString(strKey, "");
		//用完后share置空
		share = null;
		
		return strValue;
	}
	
	/**  
	 * 保存配置值到手机内存中.
	 * @return 
	 */  
	public void setMemConfValue(String strKey,String strValue) {
		if(context == null){
			return;
		}
		SharedPreferences share = context.getSharedPreferences("CAR_HPONE", 0);
		share.edit().putString(strKey, strValue).commit();
		share = null;
	}
	
	/**
	 * 获取SD卡的根目录.
	 */
	public String getSdDir() {
		
		//sd卡不可以使用.
		if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
			return "";
		}
		
		//获得sd卡的根目录.
		File sdcardDir = Environment.getExternalStorageDirectory();	
		return (sdcardDir.getPath() + File.separator);
	}
	
	/**
	 * 在SD卡上创建目录.
	 */
	public boolean createDir(String strDir) {
		File sdcardDir = new File(strDir);
		
		if(sdcardDir.exists() && sdcardDir.isFile()){
			return false;
		}
		if(!sdcardDir.exists() && !sdcardDir.mkdirs()){
			return false;
		}
		
		return true;
	}
	
	/**
	 * 获取网络图片对象.
	 * 
	 * @param strImgHttp 网络地址.
	 * @param bUseSd 是否使用SD卡存图片，
	 * 				如果使用SD卡下次再次获取图片时直接从SD上读取，不会再次下载.
	 * @return
	 */
	public Drawable getImgFromUrl(String strImgHttp, boolean bUseSd) {
		
		Drawable dr = null;
		
		//获取图片文件名
		String strImgName = Utils.getFileNameFromHttp(strImgHttp);
		
		//如果网络地址或文件名为空.
		if(Utils.isNull(strImgHttp) || Utils.isNull(strImgName)){
			return null;
		}
		
		//下载到SD卡上.
		strImgName = StaticPara.getSdImgDir() + strImgName;
		if(bUseSd && StaticPara.bSdCanUse &&
			downLoadFileToSd(strImgHttp, strImgName)){
			
			Bitmap bitmap=BitmapFactory.decodeFile(strImgName);
			dr = new BitmapDrawable(bitmap);
		}
		
		//SD卡使用失败，直接下载.
		if(dr == null){
			dr = downLoadImg(strImgHttp);
		}
		
		return dr;
	}
	
	/**
	 * 从网络图片创建图片对象.
	 * 
	 * @param strImgHttp 网络地址.
	 * @return
	 */
	private Drawable downLoadImg(String strImgHttp) {

		URL m;
		InputStream is = null;
		
		try {
			m = new URL(strImgHttp);
			is = (InputStream) m.getContent();
			Drawable drawable = Drawable.createFromStream(is, "src");
			is.close();
			
			return  drawable;
    	} catch (Exception e) {
    		return null;
    	}
	}
	
	/**
	 * 下载网络文件到SD上.
	 * 
	 * @param strFileHttp 网络地址.
	 * @param strFileSd SD卡绝对路径.
	 * @return
	 */
	public boolean downLoadFileToSd(String strFileHttp, String strFileSd) {
		
		URL m;
		InputStream is = null;
		
		//SD卡不能使用.
		if(!StaticPara.bSdCanUse){
			return false;
		}
		
		//获取图片文件名
		String strImgName = Utils.getFileNameFromHttp(strFileHttp);
				
		//文件名为空.
		if(Utils.isNull(strFileHttp) || 
			Utils.isNull(strImgName) || 
			Utils.isNull(strFileSd)){
			return false;
		}

		//检查文件是否已经存在.
		File fRes = new File(strFileSd);
		if(fRes.exists() && fRes.isFile()){
			return true;
		}
		
		//先下载到临时文件夹，防止文件下载一半被终止.
		strImgName = StaticPara.getSdTmpDir() + strImgName;
		File fSrc = new File(strImgName);
		if(fSrc.exists() && fSrc.isFile() && !fSrc.delete()){
			return false;
		}
		
		try {
			byte[] buffer = new byte[1024];
			int len = 0;
			m = new URL(strFileHttp);
			is = (InputStream) m.getContent();
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fSrc));
			while( (len=is.read(buffer)) != -1){
				bos.write(buffer, 0, len);
			}
			bos.close();     
			is.close();
			
			//再将临时文件移动到目标文件.
			fSrc.renameTo(fRes);
			
		} catch (Exception e) {
			//保存文件发生异常.
			return false;
		}
		
		return true;
	}
	
	/**
	 * 判断图片是否在SD卡上,如果存在返回图片对象，否则，返回null.
	 * 
	 * @param strImgHttp 网络相对地址.
	 * @return
	 */
	public Drawable getImgFromSd(String strImgHttp) {
		
		Drawable dr = null;
		
		if(!StaticPara.bSdCanUse){
			return null;
		}
		
		//获取图片文件名
		String strImgName = Utils.getFileNameFromHttp(strImgHttp);
		
		//如果网络地址或文件名为空.
		if(Utils.isNull(strImgHttp) || Utils.isNull(strImgName)){
			return null;
		}
		
		//SD卡上.
		strImgName = StaticPara.getSdImgDir() + strImgName;
		
		//检查文件是否已经存在.
		File fRes = new File(strImgName);
		if(!fRes.exists() || !fRes.isFile()){
			return null;
		}
		
		Bitmap bitmap=BitmapFactory.decodeFile(strImgName);
		dr = new BitmapDrawable(bitmap);
		
		return dr;
	}
	
	/**
	 * 读取应用服务器信息更新文件.
	 * 
	 * @param strFileHttp 网络地址.
	 * @return
	 */
	public ServerData readIniFile(String strFileHttp) {
		
		ServerData sd = new ServerData();
		InputStream is = null;
		InputStreamReader inputReader = null;
		BufferedReader bufReader = null;
		
		try {
			URL m = new URL(strFileHttp);
			is = (InputStream) m.getContent();
			if(Utils.isNull(strEncType)){
				inputReader = new InputStreamReader(is);
			}else{
				inputReader = new InputStreamReader(is,strEncType);
			}
			bufReader = new BufferedReader(inputReader);
			String strLine;
			boolean iAdding = false;
			while((strLine = bufReader.readLine()) != null){
				String strKey = "";
				String strValue = "";
				
				if(strLine.indexOf("//") >= 0){
					strLine = strLine.substring(0,strLine.indexOf("//"));
				}
				if(strLine.indexOf("[") >= 0 && strLine.indexOf("]") >= 0){
					if(iAdding){
						sd.closeItem();
						iAdding = false;
					}
					sd.newItem();
				}
				if(strLine.indexOf("=") >= 0){
					strKey = strLine.substring(0,strLine.indexOf("="));
					strValue = strLine.substring(strLine.indexOf("=") + 1);
				}
				if(!Utils.isNull(strKey)){
					sd.addString(strKey, strValue);
					iAdding = true;
				}
			}
			if(iAdding){
				sd.closeItem();
			}
			
			is.close();
			inputReader.close();
			bufReader.close();
			
			sd.setStatus(1);
			
		} catch (Exception e) {
			sd.setStatus(-1);
			if(is != null){
				try{is.close();}catch (Exception e1) {}
			}
			if(inputReader != null){
				try{inputReader.close();}catch (Exception e1) {}
			}
			if(bufReader != null){
				try{bufReader.close();}catch (Exception e1) {}
			}
		}
		
		return sd;
	}
}  
